package com.xhwl.centiotdata.utils;

import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.concurrent.*;

/**
 * @Author： lianghz
 * @Description：
 * @Date 2021/09/07/ 09:12
 */
public class ThreadPoolUtils {

    /**
     * 默认线程池，谨慎使用，已经出现严重的线程等待情况
     */
    public static final ExecutorService executor = new ThreadPoolExecutor(
            20,//核心线程数
            50,//最大线程数
            60L,//线程最大空闲时间
            TimeUnit.SECONDS,//时间单位
            new ArrayBlockingQueue(1000),//线程等待队列
            new CustomizableThreadFactory("executor-pool-"),//线程创建工厂
            new ThreadPoolExecutor.AbortPolicy());//拒绝策略：当任务添加到线程池中被拒绝时，它将抛出 RejectedExecutionException 异常

    /**
     * 这个线程池，只做任务分发，不处理具体业务
     */
    public static final ExecutorService taskDispatcher = new ThreadPoolExecutor(
            30,//核心线程数
            100,//最大线程数
            60L,//线程最大空闲时间
            TimeUnit.SECONDS,//时间单位
            new LinkedBlockingQueue<Runnable>(4000),//线程等待队列
            new CustomizableThreadFactory("task-pool-"),//线程创建工厂
            new ThreadPoolExecutor.CallerRunsPolicy());//拒绝策略：让提交任务的线程去执行任务

    /**
     * 人形相关，专用线程池
     */
    public static final ExecutorService pedestrianExecutor = new ThreadPoolExecutor(
            20,//核心线程数
            50,//最大线程数
            60L,//线程最大空闲时间
            TimeUnit.SECONDS,//时间单位
            new ArrayBlockingQueue(1500),//线程等待队列
            new CustomizableThreadFactory("pedestrian-pool-"),//线程创建工厂
            new ThreadPoolExecutor.CallerRunsPolicy());//拒绝策略：当任务添加到线程池中被拒绝时，它将抛出 RejectedExecutionException 异常

    /**
     * 百联同步业务线程池，这部分总是被投诉，使用单独线程池保险。。
     */
    public static final ExecutorService baiLianSyncExecutor = new ThreadPoolExecutor(
            Runtime.getRuntime().availableProcessors(), //核心线程数
            Runtime.getRuntime().availableProcessors() * 2,//最大线程数
            60L,//线程最大空闲时间
            TimeUnit.SECONDS,//时间单位
            new ArrayBlockingQueue(100),//线程等待队列
            new CustomizableThreadFactory("bai-lian-pool-"),//线程创建工厂
            new ThreadPoolExecutor.AbortPolicy());//拒绝策略：当任务添加到线程池中被拒绝时，它将抛出 RejectedExecutionException 异常

    /**
     * 告警相关，专用线程池
     */
    public static final ExecutorService alarmExecutor = new ThreadPoolExecutor(
            20,//核心线程数
            50,//最大线程数
            60L,//线程最大空闲时间
            TimeUnit.SECONDS,//时间单位
            new ArrayBlockingQueue(500),//线程等待队列
            new CustomizableThreadFactory("alarm-pool-"),//线程创建工厂
            new ThreadPoolExecutor.AbortPolicy());//拒绝策略：当任务添加到线程池中被拒绝时，它将抛出 RejectedExecutionException 异常


    /*
    用于处理延时任务
     */
    public static final ScheduledExecutorService scheduledExecutorService =
            Executors.newScheduledThreadPool(Runtime.getRuntime().availableProcessors(),
                    new CustomizableThreadFactory("scheduled-pool-"));


    public static final ExecutorService ntRoomExecutor = new ThreadPoolExecutor(
            20,//核心线程数
            50,//最大线程数
            60L,//线程最大空闲时间
            TimeUnit.SECONDS,//时间单位
            new ArrayBlockingQueue(1000),//线程等待队列
            new CustomizableThreadFactory("ntroom-pool-"),//线程创建工厂
            new ThreadPoolExecutor.CallerRunsPolicy());//拒绝策略：当任务添加到线程池中被拒绝时，它将抛出 RejectedExecutionException 异常
}
